// 计算标题长度
export function getStrLen(str: string) {
  const charsToReplace = [
    '～',
    '！',
    '¥',
    '（',
    '）',
    '【',
    '】',
    '「',
    '」',
    '，',
    '。',
  ];

  // 将数组元素用管道符(|)连接，创建一个正则表达式
  // eslint-disable-next-line regexp/prefer-character-class
  const regex = new RegExp(charsToReplace.join('|'), 'g');

  // eslint-disable-next-line no-control-regex
  return str.replaceAll(regex, 'a').replaceAll(/[^\u0000-\u00FF]/g, 'aa')
    .length;
}
// 洗牌
export function shuffleArray(array: any[]) {
  for (let i = array.length - 1; i > 0; i--) {
    const j = Math.floor(Math.random() * (i + 1));
    [array[i], array[j]] = [array[j], array[i]];
  }
  return array;
}

function cartesianProduct(resultArr: any, arr: any) {
  const result: any = [];
  resultArr.forEach((loop1: any) => {
    arr.forEach((loop2: any) => {
      result.push([...loop1, loop2]);
    });
  });
  return result;
}
export function getResult(list: any) {
  if (list.length < 2) {
    return list[0]?.map((l: any) => [l]) || [];
  }
  let result = list[0].map((l: any) => [l]);
  list.forEach((l: any, i: number) => {
    if (i) {
      result = cartesianProduct(result, l);
    }
  });
  return result;
}

/**
 * 将Base64编码的字符串转换为Blob对象。
 * Blob对象用于表示二进制大型对象，可以在浏览器环境中处理大文件或二进制数据。
 *
 * @param base64 Base64编码的字符串。
 * @param contentType 可选参数，表示生成的Blob对象的MIME类型，默认为空字符串。
 * @param sliceSize 可选参数，表示分片大小，默认为512字节。用于控制每次处理的Base64字符串长度，以优化大文件的处理。
 * @returns 返回转换后的Blob对象，如果转换失败，则返回null。
 */
// base64转blob
export const base64ToBlob = function (
  base64: string,
  contentType = '',
  sliceSize = 512,
) {
  const cleanedBase64 = base64.split(',')[1] || base64;
  const fixedBase64 = cleanedBase64.replaceAll('-', '+').replaceAll('_', '/');
  const padding = '='.repeat((4 - (fixedBase64.length % 4)) % 4);
  const validBase64 = fixedBase64 + padding;

  try {
    const byteCharacters = atob(validBase64);
    const byteArrays = [];

    // 将二进制数据分片处理，每片长度为sliceSize，创建Uint8Array数组。
    for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {
      const slice = byteCharacters.slice(offset, offset + sliceSize);

      const byteNumbers: any = Array.from({ length: slice.length });
      for (let i = 0; i < slice.length; i++) {
        // eslint-disable-next-line unicorn/prefer-code-point
        byteNumbers[i] = slice.charCodeAt(i);
      }

      // 创建Uint8Array数组，用于表示二进制数据的一个片段。
      const byteArray = new Uint8Array(byteNumbers);
      byteArrays.push(byteArray);
    }

    // 创建Blob对象，包含所有的二进制数据片段，并指定MIME类型。
    return new Blob(byteArrays, { type: contentType });
  } catch (error) {
    console.error('Failed to convert base64 to blob:', error);
    return null;
  }
};
